/*
 * UtilController.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 24/02/2011, 11:23:38 AM
 */
package com.ufps.cuatro.controlador;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.analizador.UtilAnalizador;
import com.ufps.cuatro.modelo.biblioteca.BibliotecaTrabajo;
import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.util.Bandera;

/**
 * <i><b>UtilController:</b></i><p>Esta Clase gestiona las notificaciones de
 * estados entre vistas y procesos en la generación de Componentes.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 24/02/2011
 */
public class UtilController {
    
    /**
     * Notifica un Estado, envia un Objeto y un grupo de opciones al Observador
     * para determinar un proceso de actualización.
     * @param objObserver Observador que se notificará.
     * @param objUpdate Objeto que se envia al Observador.
     * @param estado estado que se notificará.
     * @param opciones Opciones que se definirán en la notificación.
     * @return resultado de la notificación.
     */
    public static boolean notificarObservador(Observer objObserver, Object objUpdate, int estado, HashMap<String, Object> opciones){
        if(objObserver != null && objUpdate != null && opciones != null){
            Bandera objBandera = new Bandera();
            objBandera.addObserver(objObserver);        
            objBandera.setObjOpciones(opciones);        
            objBandera.setEstado(estado);
            objBandera.setObj(objUpdate);
            objBandera.notificar();
            return true;
        }
        else{                                    
            UtilRender.printlnConsole("Observador Nulo.", UtilRender.ACTION_NORMAL, false);
        }
        return false;
    }
    
    /**
     * Notifica un Estado y envia un Objeto al Observador.
     * @param objObserver Observador que se notificará.
     * @param objUpdate Objeto que se envia al Observador.
     * @param estado estado que se notificará.
     * @return resultado de la notificación.
     */
    public static boolean notificarObservador(Observer objObserver, Object objUpdate, int estado){
        if(objObserver != null && objUpdate != null){
            Bandera objBandera = new Bandera();
            objBandera.addObserver(objObserver);                    
            objBandera.setEstado(estado);
            objBandera.setObj(objUpdate);
            objBandera.notificar();
            return true;
        }
        else{                                    
            UtilRender.printlnConsole("Observador Nulo.", UtilRender.ACTION_NORMAL, false);
        }
        return false;
    }
    
    /**
     * Notifica un Estado al Observador.
     * @param objObserver Observador que se notificará.
     * @param estado estado que se notificará.
     * @return resultado de la notificación.
     */
    public static boolean notificarObservador(Observer objObserver, int estado){
        if(objObserver != null){
            Bandera objBandera = new Bandera();
            objBandera.addObserver(objObserver);                    
            objBandera.setEstado(estado);            
            objBandera.notificar();
            return true;
        }
        else{                                    
            UtilRender.printlnConsole("Observador Nulo.", UtilRender.ACTION_NORMAL, false);
        }
        return false;
    }
    
    /**
     * Reinicia el Contexto de Aplicación.
     * @return Estado del Proceso de reinicio.
     */
    public static boolean rebootApp(){
        try{                        
            UtilAnalizador.objClases = new ArrayList<ObjetoReflexion>();
            UtilAnalizador.objNombresClases = new ArrayList<String>();            
            UtilRepresentacion.objTypesData = new ArrayList<ObjetoTipoDatoReflexion>();
            UtilRepresentacion.objBibliotecaTrabajoLocal = new BibliotecaTrabajo(TipoBiblioteca.eLocal);            
            UtilRender.clearConsole();
            UtilRender.printlnConsole("Preparando Reinicio....", UtilRender.ACTION_NORMAL, false);
            UtilRender.printlnConsole("Aplicación Reiniciada....", UtilRender.ACTION_NORMAL, false);
            return true;
        }catch(java.lang.Exception ex){            
            Logger.getLogger(UtilController.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return false;
    }
}